//import mx.formatters.*;
import mx.formatters.DateFormatter;
import mx.events.FlexEvent;



// *********************************************************
// 変数宣言
// *********************************************************
// 行エリアの横幅
public var row_length:int = 4;

private var row_num:int = 0;

private var area_id:String;

// 編集テキストのパス
public var TextPath:String = "";


// *********************************************************
// ログ表示
// *********************************************************
public function log(data:Object):void {

	// 日付編集用
	var fmt:DateFormatter = new DateFormatter();

	fmt.formatString = "YYYY/MM/DD HH:NN:SS";
	var logdt:String = fmt.format( new Date );

	// JavaScript の呼び出し
	ExternalInterface.call(
		"console.log", logdt,
		" "+data
	);

}

// *********************************************************
// アプリケーションの初期化
// *********************************************************
public function InitData(event:Event):void {

	// メッセージ
	log("NakaTextArea:initData() が実行されました" );

	// イベントを実行したテキストエリアのID
//	area_id = event.currentTarget.id;
//	NakaText.wordWrap=false;

	log("NakaTextArea area_id:" + area_id);
}

// *********************************************************
// テキストエリアの初期化
// *********************************************************
public function TextInitData(event:Event):void {
//public function initData(event:flash.events.MouseEvent):void {

	// メッセージ
	log("NakaTextArea:TextInitData() が実行されました" );

	// イベントを実行したテキストエリアのID
	area_id = event.currentTarget.id;
//	NakaText.wordWrap=false;

	log("NakaTextArea area_id:" + area_id);
}



// *********************************************************
// keyのイベント
// *********************************************************
private function TextKeyHandler(event:KeyboardEvent):void {
	log(event.keyCode + "/" + event.charCode);

	rowShow();


	// テキストエリア編集時にタブにカラーを設定
	parentDocument.TextChange();
	log("ごりまっちょ");


//	var text_area:Object = this[area_id];
	
/*
	if(event.keyCode == 32){
		log("verticalScrollPosition:" + text_area.verticalScrollPosition);
		log("numLines" + text_area.numLines);
	}
*/

	// Tabキーのキーコードを取得
//	if(event.keyCode == 9){
//			tabKey("text");
//	}
}

// *********************************************************
// Tabキー入力時
// *********************************************************
private function tabKey():void{
	log("tab");

	// IDからテキストエリアを割り出す
	var text_area:Object = this[area_id];
	var FaceChar:String = text_area.text.substring(0, text_area.selectionBeginIndex);
	var BackChar:String = text_area.text.substring(text_area.selectionBeginIndex);

	// タブを挿入
	text_area.text = FaceChar + "\t" + BackChar;

	// タブの後ろにフォーカスをセット
	text_area.setSelection(text_area.selectionBeginIndex + 1, text_area.selectionEndIndex + 1);

//		text_area.setFocus();
//		log(focusManager.focus);
//		text.selectAll();
	log(text_area.selectionBeginIndex);

}

// *********************************************************
// Focus移動イベント
// *********************************************************
private function FocusChange(event:FocusEvent, id:String = ""):void{
	log("FocusChange");

	// Tabキーのキーコードを取得
	if(event.keyCode == 9){
		// イベントの動作をキャンセル
		event.preventDefault();
		//tabKey();
		InsertTab(id);
	}
}

// *********************************************************
// Tabキー入力時
// *********************************************************
private function InsertTab(area_id:String):void{
	log("tab");
	var FaceChar:String = "";
	var BackChar:String = "";

	// IDからテキストエリアを割り出す
	var text_area:Object = this[area_id];
//		var FaceChar:String = text_area.text.substring(0, text_area.selectionBeginIndex);
//		var BackChar:String = text_area.text.substring(text_area.selectionBeginIndex);

	log("active:" + text_area.selectionActivePosition + "	ancor:" + text_area.selectionAnchorPosition);
/*
	var FaceChar:String = text_area.text.substring(0, text_area.selectionActivePosition);
	var BackChar:String = text_area.text.substring(text_area.selectionActivePosition);
*/
	// 複数選択されていない場合（アクティブとアンカーが同じ）
	FaceChar = text_area.text.substring(0, text_area.selectionActivePosition);
	BackChar = text_area.text.substring(text_area.selectionActivePosition);


	if(text_area.selectionActivePosition == text_area.selectionAnchorPosition) {

		log("active == anchor");

		// 複数選択されていない場合（アクティブとアンカーが同じ）
		//FaceChar = text_area.text.substring(0, text_area.selectionActivePosition);
		//BackChar = text_area.text.substring(text_area.selectionActivePosition);

		text_area.text = FaceChar + "\t" + BackChar;

		text_area.selectRange(text_area.selectionActivePosition+1, text_area.selectionActivePosition+1 );

	} else if(text_area.selectionActivePosition > text_area.selectionAnchorPosition) {
		log("active > anchor");

		log(FaceChar);

		log("改行位置：" + FaceChar.lastIndexOf("\n"));

		// 複数選択されていない場合（アクティブとアンカーが同じ）
		BackChar = text_area.text.substring(FaceChar.lastIndexOf("\n")+1);
		FaceChar = text_area.text.substring(0, FaceChar.lastIndexOf("\n")+1);

		text_area.text = FaceChar + "\t" + BackChar;

		text_area.selectRange(text_area.selectionAnchorPosition+1, text_area.selectionActivePosition+1 );
	} else if(text_area.selectionActivePosition < text_area.selectionAnchorPosition) {
		log("active < anchor");

		FaceChar = text_area.text.substring(0, text_area.selectionAnchorPosition);
		BackChar = text_area.text.substring(text_area.selectionAnchorPosition);

		log(FaceChar);

		log("改行位置：" + FaceChar.lastIndexOf("\n"));

		// 複数選択されていない場合（アクティブとアンカーが同じ）
		BackChar = text_area.text.substring(FaceChar.lastIndexOf("\n")+1);
		FaceChar = text_area.text.substring(0, FaceChar.lastIndexOf("\n")+1);

		text_area.text = FaceChar + "\t" + BackChar;

		text_area.selectRange(text_area.selectionActivePosition+1, text_area.selectionAnchorPosition+1 );
	} else{
		log("other");
	}

	// タブを挿入

	// タブの後ろにフォーカスをセット
//		text_area.setSelection(text_area.selectionBeginIndex + 1, text_area.selectionEndIndex + 1);

//		text_area.setFocus();
//		log(focusManager.focus);
//		text.selectAll();
//		log(text.selectionBeginIndex);

}




private function rowShow():void {
	log("Starting function rowShow ...");

	var str:String = "";
	var rowNum:int = body.text.split(/\n/).length;
//	var rowNum:int = body.text.length - body.text.replace(/\n/g, "").length;
//	var rowNum:int = body.textDisplay.mx_internal::textLines.length
	log(body.height-15);


	setScroll();


	for (var i:int = 0; i < rowNum ; i++) {
		if(String(i+1).length > row_length){
			rowWidthChange(String(i+1).length);
		}

		str += (i+1) + "\n";
	}

	//rowWidthChange(String(i+1).length);

	row.text = str;

/*

	log("rowNum:" +rowNum+ "row_num" +row_num);

	if(rowNum>row_num){
		row.text += rowNum + "\n";
		if(String(rowNum).length > row_length){
			rowWidthChange(String(rowNum).length);
		}
	}
	if(rowNum<row_num){
		row.text = row.text.substr(0,row.text.lastIndexOf("\n",row.text.length - String(row_num).length-1)+1);
	}

	row_num = rowNum;


	if(row_num>_row_num){
		row.text += row_num + "\n";
		if(String(row_num).length > row_length){
			rowWidthChange(String(row_num).length);
		}
	}
	if(row_num<_row_num){
		row.text = row.text.substr(0,row.text.lastIndexOf("\n",row.text.length - String(_row_num).length-1)+1);
	}

	_row_num = row_num;
*/

}

// 行番号とbodyのスクロールバーを同期させる
private function setScroll():void {

	row.textDisplay.verticalScrollPosition = body.textDisplay.verticalScrollPosition;
}


private function rowWidthChange(length:int):void {
	row_length = length;

	body.setStyle("paddingLeft", row_length * 10);
	//body.x = row_length * 10;
	row.width = row_length * 10;
}

private function SetRowHeight():void {
	//log(body.height-15);
	row.height = body.height-15;
}

private function bodyInit():void {
	log("bodyInit()");

	// 行エリアの幅を設定する
	rowWidthChange(row_length);

	// 行番号設定
	rowShow();


	// 行エリアの高さを指定
	//row.height = body.height-15;
	//callLater(SetRowHeight);

	// body にテキストをペースト
	body.addEventListener(
				Event.PASTE,
				bodyPasteHandler
			);

	// thumb Button スクロールバーの真ん中のボタン用
	body.scroller.verticalScrollBar.thumb.addEventListener(
				MouseEvent.MOUSE_DOWN,
				thumb_mouseDownHandler
			);

	// 行番号の更新が行われたとき
	row.addEventListener(
				FlexEvent.VALUE_COMMIT,
				rowCreationComplete
			);

	// decrementButton スクロールバーの上のボタン用
	body.scroller.verticalScrollBar.decrementButton.addEventListener(
				FlexEvent.BUTTON_DOWN,
				decrementButton_mouseDownHandler
			);

	// incrementButton スクロールバーの下のボタン用
	body.scroller.verticalScrollBar.incrementButton.addEventListener(
				FlexEvent.BUTTON_DOWN,
				incrementButton_mouseDownHandler
			);


	log("end bodyInit()");
}



// *********************************************************
// イベント
// *********************************************************

// body のペーストイベント
private function bodyPasteHandler(event:Event):void {
	log("bodyPasteHandler");

	rowShow();
}

// 行エリアの更新イベント
private function rowCreationComplete(event:FlexEvent):void {
	//log("rowCreationComplete");

	// 一度値を再設定しないと動作しない
	row.textDisplay.verticalScrollPosition = 10;

	setScroll();

}

// スクロールバーのデクリメントボタン（上）を選択
private function decrementButton_mouseDownHandler(event:FlexEvent):void {
	//log("decrementButton_mouseDownHandler");

	setScroll();

}

// スクロールバーのインクリメントボタン（下）を選択
private function incrementButton_mouseDownHandler(event:FlexEvent):void {
	//log("incrementButton_mouseDownHandler");

	setScroll();
}

// スクロールバーのサムボタン（中央）をドラッグ開始
private function thumb_mouseDownHandler(event:MouseEvent):void {
	//log("thumb_mouseDownHandler");

	// ドラッグ時のイベントを登録する
	body.scroller.verticalScrollBar.systemManager.getSandboxRoot().addEventListener(
				MouseEvent.MOUSE_MOVE,
				system_mouseMoveHandler
			);

	// ドラッグ解除用のイベント
	body.scroller.verticalScrollBar.systemManager.getSandboxRoot().addEventListener(
				MouseEvent.MOUSE_UP,
				system_mouseUpHandler
			);

}

// スクロールバーのサムボタン（中央）のドラッグ解除
private function system_mouseUpHandler(event:MouseEvent):void {
	//log("system_mouseUpHandler");

		// system_mouseMoveHandler を解除する
		body.scroller.verticalScrollBar.systemManager.getSandboxRoot().removeEventListener(
				MouseEvent.MOUSE_MOVE,
				system_mouseMoveHandler
			);

		// system_mouseUpHandler を解除する
		body.scroller.verticalScrollBar.systemManager.getSandboxRoot().removeEventListener(
				MouseEvent.MOUSE_UP,
				system_mouseUpHandler
			);
}

// スクロールバーのサムボタン（中央）をドラッグ
private function system_mouseMoveHandler(event:MouseEvent):void {
	//log("system_mouseMoveHandler");
	
	setScroll();

}
